/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.univali.programacao.carraid;

import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import javax.swing.ImageIcon;

/**
 *
 * @author Murilo
 */
public class Carro extends GameObject {

    private double anguloDaFace;
    private boolean indoParaEsquerda;
    private boolean indoParaDireita;

    public Carro() {
        ImageIcon imagem = new ImageIcon(getClass().getResource("/imagem/carro.png"));
        Sprite sprite = new Sprite(imagem.getImage(), 1, 1, 62, 62);
        setSprite(sprite);
    }

    @Override
    public void draw(Graphics2D g) {
        //g.setTransform(new AffineTransform());
        //g.translate(getX() + getSprite().getLarguraDosQuadros()/2 , getY()  + getSprite().getAlturaDosQuadros()/2 );
        //g.rotate(Math.toRadians(anguloDaFace));
        //g.translate(- (getX() + getSprite().getLarguraDosQuadros()/2 ) , - (getY()  + getSprite().getAlturaDosQuadros()/2) );

        int xDest = (int) getX();
        int yDest = (int) getY();

        int right = xDest + getSprite().getLarguraDosQuadros();
        int bottom = yDest + getSprite().getAlturaDosQuadros();

        int xSource = getSprite().getQuadroAtual() * getSprite().getLarguraDosQuadros();
        int ySource = 0;

        int rightSource = xSource + getSprite().getLarguraDosQuadros();
        int bottomSource = ySource + getSprite().getAlturaDosQuadros();

        g.drawImage(getSprite().getImagem(),
                xDest, yDest, right, bottom, // Coordenadas de Destino
                xSource, ySource, rightSource, bottomSource, // Coordenadas de Origem
                null);
    }

    @Override
    public void update(long tempoDoFrame) {
        super.update(tempoDoFrame);

        if (isIndoParaDireita()) {

            if (getX() + getSprite().getLarguraDosQuadros() >= 300) {
                setVelocidade(0);
            } else {
                if (getVelocidade() < 0) {
                    if (getVelocidade() > -1) {
                        setVelocidade(0.75);
                    } else {
                        setVelocidade(getVelocidade() * 0.83);
                    }
                } else {
                    if (getVelocidade() == 0) {
                        setVelocidade(0.75);
                    }

                    if (getVelocidade() < 200) {
                        setVelocidade(getVelocidade() * 1.17);
                    }
                }
            }
        }

        if (isIndoParaEsquerda()) {
            if (getX() <= 0) {
                setVelocidade(0);
            } else {
                if (getVelocidade() > 0) {
                    if (getVelocidade() < 1) {
                        setVelocidade(-0.75);
                    } else {
                        setVelocidade(getVelocidade() * 0.83);
                    }
                } else {
                    if (getVelocidade() == 0) {
                        setVelocidade(-0.75);
                    }

                    if (Math.abs(getVelocidade()) < 200) {
                        setVelocidade(getVelocidade() * 1.17);
                    }
                }
            }
        }

        if (!isIndoParaDireita() && !isIndoParaEsquerda()) {
            if (getVelocidade() > 0) {
                if (getVelocidade() < 1) {
                    setVelocidade(-0.75);
                } else {
                    setVelocidade(getVelocidade() * 0.93);
                }
            } else if (getVelocidade() < 0) {
                if (getVelocidade() > -1) {
                    setVelocidade(0.75);
                } else {
                    setVelocidade(getVelocidade() * 0.93);
                }
            }
        }
    }

    /**
     * @return the anguloDaFace
     */
    public double getAnguloDaFace() {
        return anguloDaFace;
    }

    /**
     * @param anguloDaFace the anguloDaFace to set
     */
    public void setAnguloDaFace(double anguloDaFace) {
        this.anguloDaFace = anguloDaFace;
    }

    /**
     * @return the indoParaEsquerda
     */
    public boolean isIndoParaEsquerda() {
        return indoParaEsquerda;
    }

    /**
     * @param indoParaEsquerda the indoParaEsquerda to set
     */
    public void setIndoParaEsquerda(boolean indoParaEsquerda) {
        this.indoParaEsquerda = indoParaEsquerda;
    }

    /**
     * @return the indoParaDireita
     */
    public boolean isIndoParaDireita() {
        return indoParaDireita;
    }

    /**
     * @param indoParaDireita the indoParaDireita to set
     */
    public void setIndoParaDireita(boolean indoParaDireita) {
        this.indoParaDireita = indoParaDireita;
    }
}
